function [ p, nc ] = LAESA( P, B, D, element, k, distance)
    %wczytanie domyslnych wartosci
    if nargin<6
        distance=@EuclideanDistance;
    end
    %inicjalizacja zmiennych
    %najblizsza znaleziona odleglosc
    d=inf; 
    %indeks najblizszego znalezionego
    p=[];
    %pobranie rozmiaru
    n=size(P,1);
    m=size(B,2);
    %wartosc domyslna dla k dobrana tak, by nc>m/k bylo zawsze prawda
    if nargin<5
        k=m+1;
    end
    %ograniczenia dolne odleglosci
    G=zeros(n,1);
    %liczba dokonanych obliczen odleglosci
    nc=0; 
    %uzywane do indeksowania P(Pind)-aktualne P
    Pindex=1:n;
    %tablica przechowujaca informacje o tym czy pod danym indeksem znajduje
    %sie element z B, a jesli tak to z ktorej kolumny D nalezy korzystac
    %przy aktualizoawniu G
    indexToD=zeros(n,1);
    indexToD(B)=1:m;
    
    
    %wybor pierwszego elementu
    %sprawdzamy czy B jest puste, jesli tak to wybieramy pierwszy element z
    %P, czyli algorytm sprowadzi sie do 1NN
    
    if isempty(B) 
        if ~isempty(Pindex)
            s=Pindex(1);
        end
    else
        s=B(1);
    end
   
    %tak dlugo jak w Pind znajduja sie indeksy <=> aktualnie rozpatrywane
    %P nie jest puste
    while ~isempty(Pindex)
        %obliczamy odleglosc 
        dxs=distance(P(s,:),element);       
        %zwiekszamy licznik o 1
        nc=nc+1;
        %jesli znalezlismy blizszy punkt to zapamietujemy go
        if dxs<d 
            p=s;
            d=dxs;
        end
        %wyrzuc s z ropatrywanego P
        Pindex(Pindex==s)=[]; 
                
        if indexToD(s) %jesli nalezy do B
            %zaktualizuj G
            G(Pindex)=max(G(Pindex), abs( D(Pindex,indexToD(s)) - dxs ));
        end
        
        %default condition function
        condition=nc>m/k;
        %wyeliminowac trzeba wszystkie elementy o minimalnej mozliwej
        %odleglosci wiekszej lub rownej najlepszej sposrod P-B, oraz gdy
        %spelniono wrunek sposrod B
        toEliminate=logical(zeros(1,size(Pindex,2)));
        gb=inf;
        gq=inf;
        b=[];
        q=[];
        for i=1:size(Pindex,2)
            gp=G(Pindex(i));
            if indexToD(Pindex(i))
                if condition && gp>=d
                    toEliminate(i)=true;
                else
                    if gp<gb
                        gb=gp;
                        b=Pindex(i);
                    end
                end
            else
                if gp>=d
                    toEliminate(i)=true;
                else
                    if gp<gq
                        gq=gp;
                        q=Pindex(i);
                    end
                end
            end  
        end
        Pindex(toEliminate)=[];
        %simple choise function
        if isempty(b)
            s=q;
        else
            s=b;
        end        
    end
end
